package com.gitee.l0km.aocache.annotations;

import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;
import java.util.concurrent.TimeUnit;

import com.gitee.l0km.aocache.SafeStrategy;

/**
 * 弱引用配置的缓存方法定义注解<br>
 * 等价于
 * {@code @AoCacheable(weakKeys = true,weakValues = true)}
 * @author guyadong
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ ElementType.METHOD, ElementType.CONSTRUCTOR })
@AoCacheable(weakValues = true)
public @interface AoWeakCacheable {
	/**
	 * 是否输出调试信息
	 */
	boolean debugOutput()default false;
	/**
	 * 是否输出详细调试信息
	 */
	boolean debugOutputDetail()default false;
	/**
	 * 是否输出切面调用耗时信息
	 */
	boolean outputAroundCost()default false;
	/**
	 * 设置内部哈希表的最小总大小
	 * @see com.google.common.cache.CacheBuilder#initialCapacity(int) 
	 */
	int initialCapacity() default -1;
	/**
	 * 指定更新操作之间允许的并发性
	 * @see com.google.common.cache.CacheBuilder#concurrencyLevel(int)
	 */
	int concurrencyLevel() default 0;
	/**
	 * 指定缓存可以包含的最大条目数
	 * @see com.google.common.cache.CacheBuilder#maximumSize(long)
	 */
	long maximumSize() default -1;
	/**
	 * 指定缓存中可能包含的项的最大权重
	 * @see com.google.common.cache.CacheBuilder#maximumWeight(long)
	 */
	long maximumWeight() default -1;
	/**
	 * 指定在创建条目或最近替换其值后经过固定的持续时间后，应自动从缓存中删除每个条目
	 * @see com.google.common.cache.CacheBuilder#expireAfterWrite(long, TimeUnit)
	 */
	long expireAfterWrite() default -1;
	/**
	 * {@link #expireAfterWrite() }的时间单位
	 * @see com.google.common.cache.CacheBuilder#expireAfterWrite(long, TimeUnit)
	 */
	TimeUnit expireAfterWriteTimeUnit() default TimeUnit.MINUTES;
	/**
	 * 指定在创建条目、最近一次替换其值或最后一次访问之后经过固定的持续时间后，应自动从缓存中删除每个条目
	 * @see com.google.common.cache.CacheBuilder#expireAfterAccess(long, TimeUnit)
	 */
	long expireAfterAccess() default -1;
	/**
	 * {@link #expireAfterAccess() }的时间单位
	 * @see com.google.common.cache.CacheBuilder#expireAfterAccess(long, TimeUnit)
	 */
	TimeUnit expireAfterAccessTimeUnit() default TimeUnit.MINUTES;
	/**
	 * 指定活动条目的创建或其值的最新替换后经过固定的持续时间后，活动条目的自动刷新条件
	 * @see com.google.common.cache.CacheBuilder#refreshAfterWrite(long, TimeUnit)
	 */
	long refreshAfterWrite() default -1;
	/**
	 * {@link #refreshAfterWrite() }的时间单位
	 * @see com.google.common.cache.CacheBuilder#refreshAfterWrite(long, TimeUnit)
	 */
	TimeUnit refreshAfterWriteTimeUnit() default TimeUnit.MINUTES;

	/**
	 * 是否保存复制的方法参数<p>
	 * 为true时，以{@link SafeStrategy#CLONE}策略，保存方法调用参数，以避免外部修改影响缓存中的方法参数<br>
	 * 为false时，保存原始的方法参数。
	 */
	boolean copyArgs() default false;
	
	/**
	 * 指定方法返回值的安全策略。<p>
	 * 该策略用于定义方法返回值的安全处理方式。<br>
	 * 默认值为 {@link SafeStrategy#NONE}，表示不使用任何安全策略处理返回值。
	 */
	SafeStrategy returnSafeStrategy() default SafeStrategy.NONE;
}
